from pybroker import Strategy, highest

from pybroker.ext.data import AKShare

# 1 创建策略函数（引用内置指标)-买卖规则
def exec_fn(ctx):
   # Get the rolling 10 day high.
   high_10d = ctx.indicator('high_10d')#ctx.indicator('high_10d')来获取过去10天的最高价指标。
   # Buy on a new 10 day high.
   # 如果当前没有持仓（not ctx.long_pos()）
   # 且今天的10天最高价高于昨天的（high_10d[-1] > high_10d[-2]），则买入100股。
   if not ctx.long_pos() and high_10d[-1] > high_10d[-2]:
      ctx.buy_shares = 100
      # Hold the position for 5 days.设置持仓时间为5天
      ctx.hold_bars = 5
      # Set a stop loss of 2%.设置止损点为2%
      ctx.stop_loss_pct = 2

# 2 创建策略对象-股票
#使用YFinance()数据源和指定的开始和结束日期（'1/1/2022' 至 '7/1/2022'）来创建策略对象。
strategy = Strategy(AKShare(), start_date='1/1/2022', end_date='7/1/2022') # type: ignore

# 3 策略对象添加规则函数
#将之前定义的exec_fn作为执行函数添加到策略中。为策略添加两支股票：'AAPL' 和 'MSFT'。
# 传递一个名为highest的指示器参数，它似乎是用于计算滚动最高价的，但具体的实现和参数（如'close'和period=10）取决于pybroker库
strategy.add_execution(
   exec_fn, ['000001', '000002'], indicators=highest('high_10d', 'close', period=10)) # type: ignore

# 4 运行结果
# Run the backtest after 20 days have passed.
# 使用strategy.backtest(warmup=20)来执行回测，
# 其中warmup=20表示在回测的前20天不执行任何交易，用于计算初始的滚动指标。
result = strategy.backtest(warmup=20)
print(result)